#include <iostream>
#include <string>
#include <regex>
using namespace std;


int main()
{
    string s = "get /bitekeji/login?user=xiaoli&password=123456 HTTP/1.1\r\n";
    // string s = "GET /bitekeji/login HTTP/1.1";

    smatch sm;
    // regex e("(GET|HEAD|POST|PUT|DELETE) ([^?]*)\\?(.*) (HTTP/1\\.[01])(?:\n|\r\n)?");
    regex e("(GET|HEAD|POST|PUT|DELETE) ([^?]*)(?:\\?(.*))? (HTTP/1\\.[01])(?:\n|\r\n)?",regex::icase);
    // GET|HEAD|POST|PUT|DELETE 表示匹配并提取其中任意一个字符
    // [^?] 表示匹配 非?字符    后面的 * 表示提取1次或多次
    // \\? 表示原始的?字符      (.*) 表示提取?之后的任意字符0次或多次 直至空格结束
    // (HTTP/1\\.[01]) 表示匹配以 HTTP/1. 开始 后面的是 0字符或1字符    \\对.进行转义
    // (?:\n|\r\n)?  (?: ...) 表示匹配某个格式的字符串，但不提取  最后的? 表示的是匹配前面的表达式0次或1次
    // (?:\\?(.*))?  表示不匹配?，只匹配? 后面的内容

    bool ret = regex_match(s, sm, e);

    if(ret == false)
    {
        return -1;
    }

    for(auto e: sm)
    {
        cout << e << endl;
    }

    return 0;
}